package chapter9.section6;

//程序9-11：Optional使用示例
import java.util.Optional;

class Student {
	String name;
	int age;
	String gender;

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public String getGender() {
		return gender;
	}

	public int getAge() {
		return age;
	}

	public String toString() {
		return "姓名：" + name + ",年龄：" + age;
	}
}

public class OptionalDemo {
	public static void main(String[] args) {
		Student s1 = new Student("张三", 20);
		// s1=null; //可将该条注释取消，测试s1为空时的运行结果
		Optional<Student> optStu1 = Optional.ofNullable(s1);
		if (optStu1.isPresent())
			System.out.println(optStu1.get().toString());
		else
			System.out.println("为空");
		optStu1.ifPresent(u -> System.out.println(u.getName() + "的年龄为: " + u.getAge()));
		// 实现对年龄大于18的学生的筛选
		optStu1.filter(u -> u.getAge() > 18).ifPresent(u -> System.out.println(u.getName() + "的年龄大于18"));
		// 用map()得到学生的年龄，返回Optional<Integer>对象（如果s1为null, 返回map()方法返回一个空的Optional对象）
		System.out.println(optStu1.map(u -> u.getAge()));
		// 跟map()方法不同的是，flatMap的入参Function函数的返回值类型为Optional<T>类型，而不是T类型
		System.out.println(optStu1.flatMap(u -> Optional.ofNullable(u.getAge())));
		// orElse(other)方法，如果包装对象值非空，返回包装对象值，否则返回入参other的值（默认值）
		System.out.println(optStu1.map(u -> u.getGender()).orElse("性别未知"));// 由于s1的gender没有赋值，其值为null
		// orElseGet()方法与orElse()方法类似，区别在于orElseGet()方法的入参为一个Supplier对象，用Supplier对象的get()方法的返回值作为默认值。
		System.out.println(optStu1.map(u -> u.getGender()).orElseGet(() -> "性别未知"));
	}
}
